package src.test2;

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.util.Vector;

public class Serveur {
	
	private Vector _tabClients = new Vector(); // contiendra tous les flux de sortie vers les clients
	private int _nbClients=0; // nombre total de clients connectés

	  //** Methode : la première méthode exécutée, elle attend les connections **
	  public static void main(String args[])
	  {
	    Serveur serv = new Serveur(); // instance de la classe principale
	    try
	    {
	      Integer port;
	      if(args.length<=0) 
	      {
	    	  port=new Integer("18888"); // si pas d'argument : port 18000 par défaut

	      }
	      else 
	    	  port = new Integer(args[0]); // sinon il s'agit du numéro de port passé en argument

	      new Commande(serv); // lance le thread de gestion des commandes


	      // ouverture d'un socket serveur sur port
	     ServerSocket ss = new ServerSocket(port);
	      printWelcome(port);
	      while (true) // attente en boucle de connexion (bloquant sur ss.accept)
	      {
	        new ThreadClient(ss.accept(),serv); // un client se connecte, un nouveau thread client est lancé
	      }
	    }
	    catch (Exception e) { }
	  }

	  //** Methode : affiche le message d'accueil **
	  static private void printWelcome(Integer port)
	  {
	    System.out.println("--------");
	    System.out.println("BlablaServeur : Par Minosis - Minosis");
	    System.out.println("Copyright : 2004 - Minosis.com");
	    System.out.println("Derniere version : 10/04/2004");
	    System.out.println("--------");
	    System.out.println("Demarre sur le port : "+port.toString());
	    System.out.println("--------");
	    System.out.println("Quitter : tapez \"quit\"");
	    System.out.println("Nombre de connectes : tapez \"total\"");
	    System.out.println("Connection de Thread 1 : tapez connection1");
	    System.out.println("Connection de Thread 2 : tapez connection2");
	    System.out.println("--------");
	  }


	  //** Methode : envoie le message à tous les clients **
	  synchronized public void sendAll(String message,String sLast)
	  {
		// declaration d'une variable permettant l'envoi de texte vers le client
	    PrintWriter out; 
	    for (int i = 0; i < _tabClients.size(); i++) // parcours de la table des connectés
	    {
	    	 // extraction de l'élément courant (type PrintWriter)
	      out = (PrintWriter) _tabClients.elementAt(i);
	      if (out != null) // sécurité, l'élément ne doit pas être vide
	      {
	      	// ecriture du texte passé en paramètre (et concaténation d'une string de fin de chaine si besoin)
	        System.out.print(message+sLast);
	        out.flush(); // envoi dans le flux de sortie
	      }
	    }
	  }

	  //** Methode : détruit le client no i **
	  synchronized public void delClient(int i)
	  {
	    _nbClients--; // un client en moins ! snif
	    if (_tabClients.elementAt(i) != null) // l'élément existe ...
	    {
	      _tabClients.removeElementAt(i); // ... on le supprime
	    }
	  }

	  //** Methode : ajoute un nouveau client dans la liste **
	  synchronized public int addClient(PrintWriter out)
	  {
	    _nbClients++; // un client en plus ! ouaaaih
	    _tabClients.addElement(out); // on ajoute le nouveau flux de sortie au tableau
	    return _tabClients.size()-1; // on retourne le numéro du client ajouté (size-1)
	  }

	  //** Methode : retourne le nombre de clients connectés **
	  synchronized public int getNbClients()
	  {
	    return _nbClients; // retourne le nombre de clients connectés
	  }


}
